package mn.slide.ubjam;

import it.sephiroth.android.library.imagezoom.ImageViewTouch;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import mn.slide.ubjam.model.Grade;
import mn.slide.ubjam.model.Point;
import mn.slide.ubjam.model.Road;
import mn.slide.ubjam.parser.GradeParser;
import mn.slide.ubjam.parser.RoadParser;
import mn.slide.util.HttpConnection;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.WindowManager;
import android.widget.Toast;
public class TrafficJamActivity extends Activity {
	private Canvas canvas; // Зам зурагдах талбар
	private Paint paint; // Зурагч
	// TouchImageView img; // Touch -той ImageView
	private Bitmap ub_map; // Газрын зургын bitmap
	String LOG_TAG = "TrafficJamActivity";
	// Замын байрлалуудыг агуулсан local XML файл
	static final String ROAD_XML = "UbMap.xml";
	// Замуудын статус-н XML файлын хаяг(url)
	static final String GRADE_XML_URL = "http://192.168.1.116:8888/UBmap.xml"; // http://192.168.1.121:8888/RoadStatus.xml
																					// http://www.its.mn/TrafficInfoAction.do?forAlwaysDownLoad=67909774
	// public ArrayList<Grade> statusList = new ArrayList<Grade>();
	public ProgressDialog loading;
	public Context context;
	int count = 0;
	private ImageViewTouch mImageView;
	private BitmapFactory.Options options;
	private ArrayList<Grade> gradeList;
	public static ArrayList<Road> list= new ArrayList<Road>();
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.main);
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
		mImageView = (ImageViewTouch) findViewById(R.id.ub_map_imageview);

		context = this;

		loading = new ProgressDialog(this);
		loading.setMessage("Loading");
		loading.setCancelable(true);

		loadBitmap();

		if (gradeList == null)
			// Сервэр дээрх XML татах
			downloadXml(GRADE_XML_URL);

		/**
		 * // Touch -той ImageView үүсгэх img = new TouchImageView(this); //
		 * ImageView -д УБ bitmap оноох img.setImageBitmap(ub_map); // ImageView
		 * -н maximum zoom тодорхойлох img.setMaxZoom(4f); // Activity -н
		 * үзэгдэх View -д бэлдсэн ImageView -г оноох // setContentView(img);
		 **/

		setImage();
	}

	/**
	 * bitmap-д зураг зааж өгөх
	 */
	public void loadBitmap() {
		options = new BitmapFactory.Options();
		options.inTempStorage = new byte[16 * 1024];

		// Bitmap -д УБ map оноох
		ub_map = BitmapFactory.decodeResource(getResources(),
				R.drawable.ub_map, options).copy(Bitmap.Config.ARGB_8888, true);
	}

	/**
	 * Бэлдсэн bitmap -г ImageView -д оноож өгөх
	 */
	public void setImage() {
		mImageView.setImageBitmapReset(ub_map, true);
	}

	/**
	 * 
	 * Тухайн хаяг(link) дээрх XML файлыг татаж, түүнээс parse хийн RoadStatus
	 * төрлийн жагсаалтад оноох
	 * 
	 * @param link
	 *            - Замын статус -уудыг агуулах XML -н хаяг(url)
	 * @return - RoadStatus төрлийн жагсаалт
	 */
	public ArrayList<Grade> downloadXml(String url) {
		
		Handler handler = new Handler() {
			public void handleMessage(Message message) {
				switch (message.what) {
				case HttpConnection.DID_START: {
					loading.show();
					Log.i(LOG_TAG, "Татаж эхэллээ...");
					break;
				}
				case HttpConnection.DID_SUCCEED: {
					Log.i(LOG_TAG, "ТАТАЖ ДУУСЛАА !!!");
					// Татсан XML файлыг parse хийх
					new parseXml().execute();
					break;
				}
				case HttpConnection.DID_ERROR: {
					loading.cancel();
					Toast.makeText(context, "Холболтонд алдаа гарлаа",
							Toast.LENGTH_LONG).show();
					Log.i(LOG_TAG, "Татаж чадсангүй, алдаа гарлаа!!!");
					break;
				}
				}
			}
		};
		new HttpConnection(handler).get(url);
		return gradeList;
	}
	private class parseXml extends AsyncTask<Void, Void, Void> {

		@Override
		protected void onPreExecute() {
			// Татсан XML файлын InputStream-г parser-лүү дамжуулж
			// RoadStatus төрлийн жагсаалтад оноох
			gradeList = new ArrayList<Grade>();
			AssetManager assetManager = getAssets();
			try
			{
				InputStream inputStream = assetManager.open("download.xml");
				gradeList = GradeParser.parser(inputStream);
			}
			catch (IOException e1)
			{
				e1.printStackTrace();
			}
	
		}

		@Override
		protected void onPostExecute(Void result) {
			loading.cancel();
		}

		@Override
		protected Void doInBackground(Void... params) {
			if (ub_map != null) {
				ArrayList<Road> roads = RoadParser.parser(ROAD_XML, context);
				list= roads;
				drawRoadsOnMap(roads);
			}
			return null;
		}
	}

	/**
	 * Өгөгдсөн байршлуудын дагуу ЗАМ - уудыг зурах
	 * 
	 * @param roads
	 *            - ЗАМ-уудын мэдээлэл агуулсан Road(Зам) төрлийн жагсаалт
	 */
	public void drawRoadsOnMap(ArrayList<Road> roads) {
		canvas = new Canvas(ub_map);
		// Зурагч үүсгэх
		paint = new Paint();
		// Хүрээний өргөн тодорхойлох
		paint.setStrokeWidth(1);
		// style зааж өгөх
		paint.setStyle(Paint.Style.FILL);

		int length = gradeList.size();
		for (int i = 0; i < length; i++) {

			Road road = roads.get(i);
			Grade grade = gradeList.get(i);
			Log.i(" ", " ");
			 Log.i(LOG_TAG, "RoadName: [" + road.getRoadName() + "]");
			 Log.i(LOG_TAG, "StartPoint: [" + road.getStartPoint() + "]");
			 Log.i(LOG_TAG, "EndPoint: [" + road.getEndPoint() + "]");
			 Log.i(LOG_TAG, "grade: [" + grade.getTrafficGrade() +"]");
			 Log.i(LOG_TAG, "speed: [" + grade.getSpeed() + "]");

			// Замын дүрс
			Path path = new Path();
			boolean first = true;
			// Замын цэгүүдийг авч PATH -д оноох
			for (Point p : road.getRoadPoints()) {
				int x = p.getX() / 2;
				int y = p.getY() / 2;
				if (first) {
					first = false;
					path.moveTo(x, y);
				} else {
					path.lineTo(x, y);
				}
				
				// Log.i(LOG_TAG, "pointX: [" + p.getX() + "]");
				// Log.i(LOG_TAG, "pointY: [" + p.getY() + "]");
			}
			path.close();

			int trafficGrade = grade.getTrafficGrade();

			// СТАТУС -с хамааран замыг зурах өнгийг оноох
			switch (trafficGrade) {
			case 1:
				paint.setColor(Color.GREEN); // Зам чөлөөтэй
				break;
			case 2:
				paint.setColor(Color.YELLOW); // Удааширсан
				break;
			case 3:
				paint.setColor(Color.RED); // Түгжирсэн
				break;
			default:
				paint.setColor(Color.TRANSPARENT); // Мэдээлэлгүй
				break;
			}

			// Өгөгдсөн байрлалууд дээр тодорхойлсон зурагчаар ЗАМ зурах
			canvas.drawPath(path, paint);
		}
	}

	@Override
	protected void onResume() {
		super.onResume();
		if (ub_map == null) {
			loadBitmap();
		}
		if (mImageView == null) {
			setImage();
		}
	}

	@Override
	protected void onPause() {
		super.onPause();
		if (ub_map != null) {
			ub_map.recycle();
			ub_map = null;
		}
		if (mImageView != null) {
			mImageView.setImageBitmapReset(null, true);
		}
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		if (ub_map != null) {
			ub_map.recycle();
			ub_map = null;
		}
		if (mImageView != null) {
			mImageView.setImageBitmapReset(null, true);
		}
	}
}